package com.openlogic.common.logic.node.parse;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.noear.solon.annotation.Component;
import org.noear.solon.core.event.AppBeanLoadEndEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.openlogic.common.logic.node.enums.NodeTypeEnums;
import com.openlogic.common.logic.node.enums.ParseTypeEnums;
import com.openlogic.common.logic.node.factory.NodeParseFactory;
import com.openlogic.common.logic.node.parse.node.BaseSubNodeParseHandler;

/**
* @ClassName: NodeParse
* @Description: 节点解析处理器 
* @author weiyongpeng
* @date 2024年7月14日 上午11:50:47
 */
@Component
public class NodeParseHandler extends BaseParseHandler {
	
	private static final Logger logger = LoggerFactory.getLogger(NodeParseHandler.class);

	@Override
	protected Map<Object, List<?>> setResultMap(JSONObject nodeInfoJsonObject, JSONObject lineInfoJsonObject) {
//		logger.info("开始解析所有Node节点...");
		Map<Object, List<?>> map = new TreeMap<Object, List<?>>();
		// 设置字段含义
		map.put("Name", setFiledName(ParseTypeEnums.NODE_INFO.getParsetype()));
		// 设置节点Value
		map.put("Value", getAllValueInfo(nodeInfoJsonObject,lineInfoJsonObject));
		return map;
	}
	
	@Override
	protected List<List<?>> getAllValueInfo(JSONObject nodeInfoJsonObject, JSONObject lineInfoJsonObject) {
		// 1、确定循环域与节点直接的关系
		Map<String, String> areMap = getAreaNodeSeq(nodeInfoJsonObject); 
		// 2、线条
		Map<String, String> lineMap = new HashMap<String, String>();
		// // 获取线条的信息 将json串中的数据转换到成Map对象的值
		getValue(lineInfoJsonObject.toString(), lineMap); 
		for (Map.Entry<String, String> entry : lineMap.entrySet()) {
			JSONObject tmpObject = JSON.parseObject(entry.getValue().toString());
			getFirstAndEndNodeByArea(tmpObject, areMap); // 确定循环域中的第一个和最后一个节点
		}
		// 3、节点
		Map<String, String> idMap = new HashMap<String, String>();
		// 获取节点的信息 将json串中的数据转换到成Map对象的值
		getValue(nodeInfoJsonObject.toString(), idMap);
		List<List<?>> resultList = new ArrayList<List<?>>();
		for (Map.Entry<String, String> entry : idMap.entrySet()) {
			JSONObject tmpObject = JSON.parseObject(entry.getValue().toString());
			logger.info("Node Type is {}", tmpObject.get("type").toString());
			// 子策略 默认节点，判断节点，矩阵节点，循环域节点，规则块节点等NodeInfo里的node 根据类型
			BaseSubNodeParseHandler nodeParseHandler = NodeTypeEnums.getNodeParseByType(tmpObject.get("type").toString());
			// 获取每个节点相关的属性
			nodeParseHandler.getElementByNode(tmpObject, resultList, areMap, lineInfoJsonObject);
		}
		return resultList;
	}
	
	/**
	* 描述：确定循环域中的第一个节点和最后一个节点的ID 
	* @Title: getFirstAndEndNodeByArea
	* @param tmpObject
	* @param areMap
	* @return
	* @author weiyongpeng
	* @date  2024年7月14日 下午2:20:53
	 */
	private Map<String, String> getFirstAndEndNodeByArea(JSONObject tmpObject, Map<String, String> areMap) {
		Map<String, String> map = new HashMap<>();
		for (Map.Entry<String, String> en : areMap.entrySet()) { // 处理循环域中的线条 将循环域ID替换成循环域中第一个节点id
			if (en.getKey().startsWith("E_") || en.getKey().startsWith("F_"))
				continue;
			String startStr = "";
			if (areMap.get("E_" + en.getKey()) == null || "".equals(areMap.get("E_" + en.getKey()))) { // 不存在结束节点
				startStr = en.getValue();
			} else {
				startStr = areMap.get("E_" + en.getKey());
			}
			String endStr = "";
			if (areMap.get("F_" + en.getKey()) == null || "".equals(areMap.get("F_" + en.getKey()))) {
				endStr = en.getValue();
			} else {
				endStr = areMap.get("F_" + en.getKey());
			}

			map.put("E_" + en.getKey(), startStr.replace(tmpObject.get("from").toString() + "#", "")); // 循环域中最后一个节点
			map.put("F_" + en.getKey(), endStr.replace(tmpObject.get("to").toString() + "#", "")); // 循环域中第一个节点
		}
		areMap.putAll(map);
		return map;
	}

	@Override
	public void onEvent(AppBeanLoadEndEvent event) throws Throwable {
		NodeParseFactory.register(ParseTypeEnums.NODE_INFO.getParsetype(), this);
	}
}
